Ubuntu 22.04 환경에서 Docker와 Nginx Proxy Manager를 활용한 Nextcloud-OpenProject 통합

Ubuntu 22.04 환경에서 Docker와 Nginx Proxy Manager를 활용한 Nextcloud-OpenProject 통합

1. 서론 (Introduction)

1.1 보고서의 목표 및 최종 아키텍처 개요

본 보고서는 Ubuntu 22.04 LTS 운영체제 환경에서 Docker Compose를 기반으로 하여, 대표적인 오픈소스 협업 도구인 Nextcloud Hub와 프로젝트 관리 시스템인 OpenProject를 설치하고 통합하는 전 과정을 상세히 기술하는 것을 목표로 한다. 특히, 본 가이드에서 제시하는 아키텍처는 보안, 확장성, 그리고 유지보수성을 극대화하기 위해 물리적 또는 논리적으로 분리된 두 개의 서버를 활용하는 분리형 모델을 채택한다.

최종 아키텍처는 다음과 같이 구성된다.

  1. 애플리케이션 서버 (Server A): Nextcloud Hub와 OpenProject 스택이 Docker 컨테이너로 실행되는 주 서버이다. 모든 애플리케이션은 내부적으로 HTTP 프로토콜을 통해 통신하며, 외부 인터넷망에 직접 노출되지 않는다.
  2. 프록시 서버 (Server B): Nginx Proxy Manager가 단독으로 운영되는 서버로, 외부의 모든 웹 트래픽을 수신하는 게이트웨이 역할을 수행한다. 이 서버는 TLS/SSL 암호화 종료(Termination)를 담당하며, 수신된 HTTPS 요청을 내부 네트워크를 통해 애플리케이션 서버의 HTTP 서비스로 안전하게 전달(Reverse Proxy)한다.

이러한 아키텍처는 보안 경계를 명확히 설정하여 애플리케이션 서버를 외부 위협으로부터 보호하고, 트래픽 관리와 애플리케이션 운영을 분리함으로써 각 구성 요소의 독립적인 확장과 관리를 용이하게 한다.

1.2 통합의 시너지 효과

Nextcloud는 파일 동기화 및 공유를 중심으로 한 강력한 콘텐츠 협업 플랫폼(Content Collaboration Platform)이며, OpenProject는 전통적 및 애자일 프로젝트 관리를 위한 포괄적인 기능을 제공하는 시스템이다.1 이 두 시스템의 통합은 단순한 기능의 합을 넘어, 조직의 워크플로우를 근본적으로 개선하는 시너지 효과를 창출한다.

통합 환경에서 사용자는 OpenProject의 작업 패키지(Work Package) 내에서 직접 Nextcloud에 저장된 파일을 첨부하거나, 새로운 파일을 업로드할 수 있다. 반대로, Nextcloud에서는 특정 파일이나 폴더에 연결된 OpenProject 작업 패키지를 확인하고, 심지어 새로운 작업 패키지를 생성할 수도 있다.2 이는 프로젝트 관리와 관련된 모든 파일 자산을 중앙에서 관리하고, 작업의 맥락 안에서 필요한 문서에 즉시 접근할 수 있게 하여 정보의 파편화를 방지한다. 결과적으로, 팀 구성원들은 분산된 정보를 찾기 위해 소요되는 시간을 줄이고, 핵심 업무에 더욱 집중하여 생산성을 극대화할 수 있다.4 본 보고서는 이러한 통합 워크플로우를 구축하기 위한 기술적 토대를 마련하는 구체적인 절차를 제시한다.

2. 인프라 환경 준비 (Infrastructure Preparation)

2.1 서버 요구사항 및 네트워크 구성

안정적인 서비스 운영을 위해 두 서버는 최소한의 사양을 충족해야 하며, 네트워크는 아키텍처의 핵심 요구사항에 맞게 정교하게 구성되어야 한다.

2.1.1 서버 사양

  • 애플리케이션 서버 (Server A): Nextcloud와 OpenProject, 그리고 관련 데이터베이스 및 캐시 컨테이너가 동시에 실행되므로 충분한 리소스가 필요하다. OpenProject는 Docker 환경에서 최소 4GB의 RAM 할당을 요구하므로 5, 전체 시스템의 원활한 작동을 위해 다음 사양을 권장한다.
  • CPU: 4 vCPU 이상
  • RAM: 8 GB 이상
  • Storage: 50 GB 이상의 SSD (사용자 데이터 양에 따라 확장 필요)
  • 프록시 서버 (Server B): Nginx Proxy Manager는 상대적으로 가벼운 애플리케이션이지만, 모든 트래픽을 처리하므로 네트워크 성능이 중요하다.
  • CPU: 2 vCPU 이상
  • RAM: 2 GB 이상
  • Storage: 20 GB 이상의 SSD

2.1.2 네트워크 아키텍처

본 아키텍처의 성공적인 구현을 위해서는 다음 네트워크 구성이 필수적이다.

  • 서버 간 통신: 두 서버는 동일한 사설 네트워크(LAN 또는 VLAN)에 위치하여 서로의 내부 IP 주소를 통해 통신할 수 있어야 한다. 이 내부 통신 경로는 외부 인터넷과 격리되어야 한다.
  • DNS 설정: Nextcloud와 OpenProject 서비스에 사용할 공개 도메인(예: nextcloud.yourdomain.com, openproject.yourdomain.com)의 DNS A 레코드는 반드시 프록시 서버(Server B)의 공인 IP 주소를 가리키도록 설정해야 한다. 모든 외부 요청은 프록시 서버를 통해야만 한다.
  • 방화벽 규칙: 보안 강화를 위해 각 서버의 방화벽(예: ufw) 규칙을 다음과 같이 설정해야 한다. 이 구성은 애플리케이션 서버로의 직접적인 외부 접근을 원천적으로 차단하고, 오직 신뢰된 프록시 서버를 통해서만 통신을 허용하는 ‘Zero Trust’ 원칙을 일부 적용한다.
  • 프록시 서버 (Server B):
  • 외부 인터넷(Any)으로부터의 TCP 포트 80 (HTTP) 및 443 (HTTPS) 트래픽을 허용한다.
  • Nginx Proxy Manager 관리자 UI 접근을 위해 내부 네트워크 대역(예: 192.168.1.0/24)으로부터의 TCP 포트 81 접근을 허용한다. 이 포트는 절대로 외부 인터넷에 노출되어서는 안 된다.
  • 애플리케이션 서버 (Server A):
  • 프록시 서버(Server B)의 내부 IP 주소로부터 Nextcloud와 OpenProject가 사용할 포트(본 가이드에서는 각각 TCP 8080, 8081)로의 접근만을 허용한다.
  • 그 외 모든 외부로부터의 직접적인 접근은 차단한다.

이 복잡한 다중 서버 아키텍처의 핵심 구성 요소를 명확히 이해하기 위해 다음 표를 참조하라. 이 표는 설정 과정에서 발생할 수 있는 혼란을 방지하고, 전체 시스템의 논리적 흐름을 명확하게 파악하는 데 도움을 준다.

항목애플리케이션 서버 (Server A)프록시 서버 (Server B)
역할Nextcloud & OpenProject 호스팅TLS 종료 및 리버스 프록시
내부 IP (예시)192.168.1.10192.168.1.20
공인 IPN/AYOUR_PUBLIC_IP
DNS 레코드N/Anextcloud.yourdomain.com -> YOUR_PUBLIC_IP openproject.yourdomain.com -> YOUR_PUBLIC_IP
방화벽 규칙 (Inbound)Allow TCP 8080, 8081 from 192.168.1.20Allow TCP 80, 443 from Any Allow TCP 81 from 192.168.1.0/24

2.2 Docker 환경 준비

본 가이드는 Docker와 Docker Compose 플러그인이 이미 시스템에 설치되어 있는 것을 전제로 한다. 만약 설치가 필요하다면, 아래 Docker 공식 문서를 참조하여 설치를 진행하라. 공식 저장소를 통해 설치하는 것이 보안 및 유지보수 측면에서 가장 권장된다.10

  • Docker 공식 설치 안내 (Ubuntu): https://docs.docker.com/engine/install/ubuntu/ 10

3. Nextcloud Hub 배포 및 서비스 노출 (Application Server)

애플리케이션 서버(Server A)에서는 PostgreSQL 데이터베이스와 Redis 캐시를 포함하는 완전한 Nextcloud Hub 스택을 배포한다.

3.1 Docker Compose 및 Secrets 구성

요청하신 nextcloud:31.0-apache 이미지를 사용한다. 이 이미지는 Apache 웹 서버를 내장하고 있어 별도의 웹 서버 컨테이너 없이 단독으로 실행할 수 있으므로 구성이 간결하다.6

보안을 최우선으로 고려하여, 데이터베이스 암호나 관리자 계정 정보와 같은 민감한 데이터를 Docker Secrets를 통해 관리한다. 이 방식은 구성 파일(docker-compose.yml)과 실제 비밀 정보를 물리적으로 분리하여 안전성을 높인다.6

애플리케이션 서버(Server A)의 사용자 홈 디렉토리에 nextcloud 작업 디렉토리를 생성하고, 그 안에 secrets 하위 디렉토리를 생성한다.

mkdir -p ~/nextcloud/secrets
cd ~/nextcloud

secrets 디렉토리 안에 다음 5개의 텍스트 파일을 생성하고, 각 파일에는 해당 값만 한 줄로 입력한다. (파일 끝에 줄바꿈이 없도록 주의) 아래는 각 파일에 입력할 내용의 예시이다. 실제 배포 시에는 보안을 위해 예시와 다른 강력한 비밀번호를 사용해야 한다.

  • secrets/postgres_db.txt: PostgreSQL 데이터베이스의 이름을 지정한다.
  • 예시 내용: nextcloud_db
  • secrets/postgres_user.txt: PostgreSQL 데이터베이스 사용자의 이름을 지정한다.
  • 예시 내용: nextcloud_user
  • secrets/postgres_password.txt: PostgreSQL 사용자의 비밀번호를 지정한다. 보안을 위해 복잡하고 예측하기 어려운 문자열을 사용하는 것이 매우 중요하다.
  • 예시 내용: MySecretPostgresPassword123!
  • secrets/nextcloud_admin_user.txt: Nextcloud 초기 관리자 계정의 사용자명을 지정한다.
  • 예시 내용: nc-admin
  • secrets/nextcloud_admin_password.txt: Nextcloud 초기 관리자 계정의 비밀번호를 지정한다. 이 또한 강력한 비밀번호를 사용해야 한다.
  • 예시 내용: MyNextcloudAdminPassword456!

이제 nextcloud 디렉토리에 다음 내용으로 docker-compose.yml 파일을 작성한다. 이 파일은 app (Nextcloud-Apache), db (PostgreSQL), redis (캐시) 서비스를 정의한다.

# /home/$USER/nextcloud/docker-compose.yml
version: '3.8'

services:
db:
image: postgres:15-alpine
restart: always
volumes:
- db:/var/lib/postgresql/data
environment:
- POSTGRES_DB_FILE=/run/secrets/postgres_db
- POSTGRES_USER_FILE=/run/secrets/postgres_user
- POSTGRES_PASSWORD_FILE=/run/secrets/postgres_password
secrets:
- postgres_db
- postgres_user
- postgres_password

redis:
image: redis:7-alpine
restart: always

app:
image: nextcloud:31.0-apache
restart: always
ports:
- "8080:80"
volumes:
- nextcloud:/var/www/html
environment:
- POSTGRES_HOST=db
- REDIS_HOST=redis
- POSTGRES_DB_FILE=/run/secrets/postgres_db
- POSTGRES_USER_FILE=/run/secrets/postgres_user
- POSTGRES_PASSWORD_FILE=/run/secrets/postgres_password
- NEXTCLOUD_ADMIN_USER_FILE=/run/secrets/nextcloud_admin_user
- NEXTCLOUD_ADMIN_PASSWORD_FILE=/run/secrets/nextcloud_admin_password
- TRUSTED_PROXIES=192.168.1.20 # 프록시 서버(Server B)의 내부 IP
depends_on:
- db
- redis
secrets:
- postgres_db
- postgres_user
- postgres_password
- nextcloud_admin_user
- nextcloud_admin_password

volumes:
db:
nextcloud:

secrets:
postgres_db:
file:./secrets/postgres_db.txt
postgres_user:
file:./secrets/postgres_user.txt
postgres_password:
file:./secrets/postgres_password.txt
nextcloud_admin_user:
file:./secrets/nextcloud_admin_user.txt
nextcloud_admin_password:
file:./secrets/nextcloud_admin_password.txt

이 구성에서 TRUSTED_PROXIES 환경 변수는 매우 중요하다. 리버스 프록시 환경에서 클라이언트의 요청은 프록시 서버를 거쳐 애플리케이션 서버로 전달된다. 이 과정에서 애플리케이션 서버가 보는 요청의 출발지 IP는 실제 클라이언트가 아닌 프록시 서버의 IP가 된다. TRUSTED_PROXIES에 프록시 서버의 내부 IP를 지정하면, Nextcloud는 해당 IP로부터 전달된 X-Forwarded-For와 같은 HTTP 헤더를 신뢰하고, 헤더에 포함된 원본 클라이언트 IP를 실제 접속자 IP로 인식하게 된다.6 이 설정이 누락되면 Nextcloud는 보안 경고를 표시하고, 로그인 시도 IP 로깅이나 비정상 접근 차단과 같은 보안 기능이 올바르게 작동하지 않을 수 있다.

3.2 스택 실행 및 초기화

스택을 시작하기 전, 데이터 영속성이 어떻게 관리되는지 이해하는 것이 중요하다. docker-compose.yml 파일 하단의 volumes: 섹션은 dbnextcloud라는 이름의 볼륨을 정의한다. 이는 Docker가 관리하는 전용 저장 공간으로, 데이터베이스와 Nextcloud 애플리케이션 데이터(사용자 파일, 설정 등)를 컨테이너와 분리하여 영구적으로 보존하기 위해 설계되었다.6 사용자가 이 볼륨들을 직접 생성할 필요는 없으며, docker compose up -d 명령을 처음 실행할 때 Docker Compose가 호스트 시스템에 자동으로 생성한다. 이를 통해 컨테이너가 삭제되거나 업데이트되더라도 데이터는 안전하게 유지된다.

docker-compose.yml 파일이 위치한 ~/nextcloud 디렉토리에서 다음 명령을 실행하여 Nextcloud 스택을 시작한다.

docker compose up -d

컨테이너들이 생성되고 초기화되는 데 몇 분 정도 소요될 수 있다. docker compose logs -f app 명령으로 Nextcloud 앱 컨테이너의 로그를 실시간으로 확인하여 초기화가 완료되었는지 확인할 수 있다. 초기화가 완료되면, 외부 접속 설정 전에 내부 네트워크에서 http://<애플리케이션_서버_내부_IP>:8080 (예: http://192.168.1.10:8080)으로 접속하여 Nextcloud 로그인 화면이 나타나는지 확인한다.

3.3 리버스 프록시 및 TLS 설정

이미 구성된 Nginx Proxy Manager를 사용하여 Nextcloud를 외부 인터넷에 안전하게 노출시킨다. 이 과정은 외부의 암호화된 HTTPS 트래픽을 수신하여, 내부 애플리케이션 서버에서 HTTP로 실행 중인 Nextcloud 서비스로 전달하는 역할을 한다. 프록시 서버(Server B)의 Nginx Proxy Manager 웹 UI에서 다음 설정으로 프록시 호스트를 추가한다.

필드설명
DetailsDomain Namesnextcloud.yourdomain.comNextcloud 서비스에 사용할 공개 도메인 주소.
Schemehttp프록시와 애플리케이션 서버 간 통신은 암호화되지 않은 HTTP를 사용한다. TLS는 프록시에서 종료된다.
Forward Hostname / IP192.168.1.10애플리케이션 서버(Server A)의 내부 IP 주소.
Forward Port8080docker-compose.yml에서 Nextcloud app 컨테이너에 매핑한 호스트 포트.
Block Common Exploits활성화SQL 인젝션, XSS 등 일반적인 웹 공격을 방어하는 기본 기능을 활성화한다.
SSLSSL CertificateRequest a new SSL CertificateLet’s Encrypt를 통해 새로운 무료 SSL 인증서를 자동으로 발급받는다.
Force SSL활성화모든 HTTP 요청을 HTTPS로 강제 리디렉션하여 보안을 강화한다.
I Agree to the Let’s Encrypt ToS활성화Let’s Encrypt 서비스 이용 약관에 동의한다.

설정이 완료되면, 웹 브라우저에서 https://nextcloud.yourdomain.com으로 접속하여 HTTPS가 적용된 Nextcloud 로그인 화면을 확인할 수 있다. secrets에 설정한 관리자 계정으로 로그인하여 정상 작동을 최종 검증한다.

4. OpenProject 배포 및 서비스 노출 (Application Server)

애플리케이션 서버(Server A)에 OpenProject를 배포한다. OpenProject는 공식적으로 git 저장소를 복제하여 사용하는 방식을 권장하며, 이는 향후 업데이트 관리를 매우 용이하게 한다.

4.1 공식 배포 절차 준수

애플리케이션 서버(Server A)의 사용자 홈 디렉토리에서 다음 명령을 실행하여 공식 openproject-docker-compose 저장소를 복제한다. --branch=stable/16 옵션은 안정적인 최신 버전(이 문서 작성 시점 기준 16.x)을 사용하도록 지정한다.7

git clone https://github.com/opf/openproject-docker-compose.git --depth=1 --branch=stable/16 openproject
cd openproject

4.2 환경 변수 설정

OpenProject 스택의 동작은 .env 파일과 docker-compose.override.yml 파일을 통해 제어된다. 이 방식은 공식 docker-compose.yml 파일을 직접 수정하지 않고도 사용자 정의 설정을 적용할 수 있게 하여, git pull을 통한 업데이트 시 발생할 수 있는 충돌을 방지하는 매우 견고한 구성 관리 전략이다.

  1. .env 파일 생성 및 설정:

제공된 예제 파일을 복사하여 .env 파일을 생성한다.

cp.env.example.env

텍스트 편집기로 .env 파일을 열고 다음 변수들을 설정한다.7

  • SECRET_KEY_BASE: 애플리케이션의 세션 암호화 등에 사용되는 매우 중요한 보안 키이다. openssl rand -hex 64와 같은 명령을 사용하여 생성된 강력한 무작위 문자열로 반드시 교체해야 한다.
  • OPENPROJECT_HOST__NAME: OpenProject에 사용할 공개 도메인(예: openproject.yourdomain.com)을 입력한다.
  • PORT: Nextcloud와 충돌하지 않도록 다른 포트를 지정한다. 여기서는 8081을 사용한다. 또한, 보안을 위해 127.0.0.1:8081로 설정하여 컨테이너의 웹 서비스가 서버의 로컬 인터페이스에만 바인딩되도록 한다.
  • OPENPROJECT_HTTPS: TLS/SSL 처리는 프록시 서버에서 담당하므로 false로 설정한다.
#.env 파일 수정 예시
SECRET_KEY_BASE=YOUR_SUPER_SECRET_AND_RANDOMLY_GENERATED_KEY_HERE
OPENPROJECT_HOST__NAME=openproject.yourdomain.com
PORT=127.0.0.1:8081
OPENPROJECT_HTTPS=false
  1. docker-compose.override.yml 파일 생성:

로컬 환경에 특화된 설정(예: 포트 매핑)을 추가하기 위해 docker-compose.override.yml 파일을 생성한다. Docker Compose는 실행 시 기본 docker-compose.yml과 docker-compose.override.yml 파일을 자동으로 병합하여 최종 구성을 결정한다.7

# /home/$USER/openproject/docker-compose.override.yml
services:
app:
ports:
- "8081:80"

이 설정은 호스트 서버의 8081 포트로 들어오는 요청을 OpenProject app 컨테이너의 80 포트로 전달하도록 매핑한다.

4.3 스택 실행 및 리버스 프록시 설정

Nextcloud 설정과 마찬가지로, OpenProject 스택 또한 Docker 볼륨을 사용하여 데이터베이스(_pgdata)와 첨부 파일(_opdata) 데이터의 영속성을 보장한다.5 이 볼륨들은 공식 docker-compose.yml 파일에 정의되어 있으며, 스택을 처음 시작할 때 Docker Compose에 의해 자동으로 생성되어 프로젝트 데이터를 안전하게 보호한다.

모든 구성이 완료되면 openproject 디렉토리에서 다음 명령을 실행하여 스택을 시작한다.

docker compose up -d

초기 실행 시 데이터베이스 마이그레이션 등으로 인해 시간이 다소 소요될 수 있다. 스택이 완전히 실행된 후, Nginx Proxy Manager UI에서 외부 HTTPS 연결을 내부 HTTP 서비스로 전달하도록 OpenProject용 프록시 호스트를 설정한다. Forward Portdocker-compose.override.yml에서 설정한 8081로 지정하고, 그 외 설정은 Nextcloud와 동일하게 구성한다.

설정이 완료되면 https://openproject.yourdomain.com으로 접속하여 OpenProject 로그인 화면을 확인한다. 초기 관리자 계정은 admin / admin 이다. 로그인 후 즉시 새로운 비밀번호로 변경하여 계정을 보호해야 한다.7

5. Nextcloud와 OpenProject 통합

두 애플리케이션의 배포가 완료되었으므로, 이제 양방향 연동을 통해 통합 워크플로우를 구축한다. 이 과정은 두 애플리케이션이 서로를 신뢰하는 클라이언트이자 서버로 인식하는 상호 신뢰 관계를 OAuth 2.0 프로토콜을 통해 구축하는 것이다.

5.1 Nextcloud 측 통합 설정

  1. Nextcloud에 관리자 계정으로 로그인한다.
  2. 우측 상단 프로필 아이콘을 클릭하여 Apps 메뉴로 이동한다.
  3. 왼쪽 카테고리에서 Integration을 선택하거나 검색창을 사용하여 ‘OpenProject Integration’ 앱을 찾아 Download and enable 버튼을 클릭하여 설치 및 활성화한다.9
  4. 다시 프로필 아이콘을 클릭하여 Settings 메뉴로 이동한 후, 왼쪽 Administration 섹션에서 OpenProject Integration을 선택한다.
  5. OpenProject host 필드에 OpenProject의 전체 URL(https://openproject.yourdomain.com)을 입력하고 Save 버튼을 클릭한다.9

5.2 OpenProject 측 통합 설정

  1. OpenProject에 관리자 계정으로 로그인한다.
  2. 우측 상단 프로필 아이콘을 클릭하여 Administration 메뉴로 이동한다.
  3. 왼쪽 메뉴에서 Files > External file storages를 선택한다.
  4. + Storage 버튼을 클릭하여 새로운 파일 스토리지 생성을 시작한다.
  5. Provider type은 기본값인 ’Nextcloud’로 둔다.
  6. Name 필드에 이 연결을 식별할 수 있는 이름(예: Corporate Nextcloud)을 입력한다.
  7. Host URL 필드에 Nextcloud의 전체 URL(https://nextcloud.yourdomain.com)을 입력한다.
  8. Save and continue setup 버튼을 클릭하여 저장을 완료하고 인증 설정 단계로 넘어간다.9

5.3 OAuth 2.0 기반 인증 연동

본 가이드에서는 모든 OpenProject 버전에서 사용 가능한 표준 Two-way OAuth 2.0 authorization code flow 방식을 기준으로 설명한다.9 이 과정은 양쪽 애플리케이션에서 생성된 자격 증명(Client ID, Client Secret)을 교차로 입력하는 방식으로 진행된다. 다음 표는 데이터의 흐름을 명확하게 시각화하여 설정 과정의 혼란을 방지한다.

단계수행 위치작업대상 값
1OpenProjectClient IDClient Secret 복사Nextcloud가 OpenProject에 접근하기 위한 자격 증명
2Nextcloud1단계에서 복사한 값을 붙여넣기OpenProject Credentials 섹션에 입력 후 저장
3NextcloudClient IDClient Secret 복사OpenProject가 Nextcloud에 접근하기 위한 자격 증명
4OpenProject3단계에서 복사한 값을 붙여넣기Nextcloud Credentials 섹션에 입력 후 저장

위 표의 절차를 상세히 설명하면 다음과 같다.

  1. OpenProject에서 Nextcloud로: OpenProject의 파일 스토리지 설정 화면(Authentication 탭)에 표시된 Client IDClient Secret을 복사한다.
  2. Nextcloud의 OpenProject Integration 설정 화면으로 돌아가, 복사한 값을 OpenProject Credentials 섹션의 해당 필드에 붙여넣고 저장한다.
  3. Nextcloud에서 OpenProject로: 이제 Nextcloud 설정 화면에 새로 표시된 Client IDClient Secret을 복사한다.
  4. 다시 OpenProject의 파일 스토리지 설정 화면으로 돌아와, 복사한 값을 Nextcloud Credentials 섹션의 해당 필드에 붙여넣고 저장한다.
  5. 모든 값이 정확히 입력되고 저장되면, 인증 설정이 완료된다. OpenProject 설정 화면 하단의 Done, complete setup 버튼을 클릭하여 최종 마무리한다.

5.4 통합 기능 활성화 및 검증

인증 연동이 완료된 후, 실제 프로젝트에서 통합 기능을 활성화하고 테스트해야 한다.

  1. OpenProject에서 통합 기능을 사용할 프로젝트로 이동한다.
  2. 왼쪽 메뉴에서 Project settings > Files 탭으로 이동한다.
  3. 비활성화된 파일 스토리지 목록에서 방금 생성한 Nextcloud 스토리지(예: Corporate Nextcloud)를 찾아 + 버튼을 클릭하여 활성화한다.9
  4. 이제 해당 프로젝트의 작업 패키지(Work Package) 중 하나를 열고, 상단의 Files 탭을 선택한다.
  5. Link files from Nextcloud (또는 유사한 이름의) 버튼이 나타나는 것을 확인할 수 있다.
  6. 버튼을 클릭하면 Nextcloud에 로그인하고 파일 접근을 허용하라는 OAuth 동의 화면이 나타난다. 승인 후 Nextcloud의 파일 탐색기가 나타나면, 파일을 선택하여 작업 패키지에 성공적으로 연결되는지 최종 검증한다.2

6. 연구개발부서 협업 플랫폼을 위한 권장 구성

Nextcloud와 OpenProject의 기본 통합만으로도 강력한 협업 환경이 구축되지만, 연구개발(R&D) 부서의 특수한 요구사항을 충족시키기 위해 몇 가지 추가 앱과 구성을 적용하는 것이 좋다. 다음은 R&D 워크플로우를 극대화하기 위한 권장 사항이다.

6.1 지식 관리 시스템 구축: Nextcloud Collectives

연구개발 과정에서 발생하는 모든 기술 문서, 회의록, 연구 자료, 내부 규격 등을 체계적으로 관리하기 위해 위키(Wiki) 형태의 지식 관리 시스템은 필수적이다.

  • 추천 앱: Collectives
  • 설명: Collectives는 Nextcloud 내에서 공동으로 지식 베이스를 구축하고 관리할 수 있게 해주는 앱이다.11 사용자는 프로젝트별 또는 팀별로 ’Collective’라는 공간을 생성하고, 그 안에 페이지를 만들어 문서를 작성할 수 있다. 모든 문서는 버전 관리가 되며, Nextcloud의 강력한 검색 기능을 통해 필요한 정보를 쉽게 찾을 수 있다.13
  • R&D 활용 방안:
  • 신규 입사자를 위한 온보딩 문서 작성
  • 프로젝트 기술 사양 및 아키텍처 문서 관리
  • 주간 회의록 및 결정 사항 아카이빙
  • 연구 결과 및 실험 데이터 정리

6.2 실시간 문서 협업: Nextcloud Office (Collabora) 와 ONLYOFFICE

제안서, 보고서, 예산안 등 오피스 문서를 여러 팀원이 동시에 편집해야 하는 경우가 많다. Nextcloud는 두 가지 강력한 온라인 오피스 솔루션을 제공한다.

  • 기본 추천: Nextcloud Office (Collabora 기반)
  • 설명: Nextcloud와 긴밀하게 통합되어 있으며, LibreOffice를 기반으로 하여 높은 파일 호환성을 제공한다.14 서버 측 렌더링 방식을 사용하여 문서 데이터가 서버 외부로 유출될 위험이 적어 보안에 유리하다.11
  • 대안: ONLYOFFICE
  • 설명: Microsoft Office와의 호환성이 매우 뛰어나며, UI/UX가 유사하여 기존 MS Office 사용자에게 친숙하다.14 클라이언트 측 렌더링을 사용하여 성능이 더 빠를 수 있지만, 무료 커뮤니티 버전은 모바일 편집 기능이 제한되는 등의 제약이 있다.14
  • 결정 가이드: 보안과 긴밀한 통합을 최우선으로 한다면 Nextcloud Office를, MS Office 파일과의 완벽한 호환성과 익숙한 UI가 더 중요하다면 ONLYOFFICE를 고려할 수 있다. 두 솔루션 모두 별도의 Docker 컨테이너로 배포하는 것이 성능과 안정성 면에서 권장된다.16

6.3 기술 다이어그램 작성: Draw.io 통합

소프트웨어 아키텍처, 네트워크 구성도, 순서도 등 복잡한 기술 다이어그램을 그리고 공유하는 것은 R&D 부서의 핵심 활동 중 하나이다.

  • 추천 앱: Draw.io

  • 설명: Nextcloud 앱스토어에서 Draw.io 앱을 설치하면, Nextcloud 내에서 직접 전문적인 다이어그램을 생성하고 편집할 수 있다.18 생성된

.drawio 파일은 다른 파일과 동일하게 공유하고 버전 관리가 가능하다. 특히 .drawio.svg 또는 .drawio.png 형식으로 저장하면, 다이어그램이 이미지 파일로 보이면서도 언제든지 다시 편집할 수 있는 메타데이터를 포함하여 활용도가 높다.20

  • R&D 활용 방안:

  • 시스템 아키텍처 설계 및 시각화

  • 개발 프로세스 및 알고리즘 순서도 작성

  • DB 스키마 및 ERD(Entity-Relationship Diagram) 모델링

6.4 개발 워크플로우 연동: OpenProject의 Git 리포지토리 통합

소프트웨어 개발 프로젝트의 경우, 코드 변경 사항(커밋, 머지 리퀘스트)과 프로젝트 관리 시스템의 작업 항목(Task, Bug)을 연결하여 추적하는 것이 매우 중요하다.

  • 추천 구성: OpenProject의 GitHub 또는 GitLab 통합
  • 설명: OpenProject는 GitHub 및 GitLab과의 공식 통합 기능을 제공한다.21 이 통합을 설정하면, 개발자가 커밋 메시지나 머지 리퀘스트 설명에 특정 작업 패키지 ID(예: OP#123)를 포함시키는 것만으로도 해당 작업 패키지에 코드 변경 내역이 자동으로 기록된다.23
  • R&D 활용 방안:
  • 추적성 강화: 특정 기능 개발이나 버그 수정이 어떤 코드 변경으로 이루어졌는지 명확하게 추적할 수 있다.
  • 자동화된 상태 업데이트: 머지 리퀘스트가 병합될 때 연결된 작업 패키지의 상태를 자동으로 ’완료’로 변경하는 등의 워크플로우 자동화가 가능하다.24
  • 커뮤니케이션 효율화: 프로젝트 관리자와 개발자 간의 불필요한 상태 보고를 줄이고, 모든 관련 정보를 OpenProject 작업 패키지 내에서 중앙 관리할 수 있다.

7. 결론 및 유지보수 전략 (Conclusion and Maintenance Strategy)

7.1 구축된 아키텍처 요약

본 보고서에서 제시한 절차를 통해, 보안과 확장성을 핵심 가치로 설계된 분리형 프록시 아키텍처 기반의 안정적인 Nextcloud-OpenProject 통합 환경을 성공적으로 구축하였다. 애플리케이션 서버와 프록시 서버의 역할을 명확히 분리함으로써 외부 공격 표면을 최소화하였고, Docker Compose와 공식 배포 방식을 채택하여 시스템의 재현성과 유지보수성을 확보하였다. 최종적으로 두 선도적인 오픈소스 솔루션을 OAuth 2.0으로 안전하게 연동하여, 파일 관리와 프로젝트 관리가 유기적으로 결합된 고효율 협업 플랫폼의 기술적 토대를 마련하였다.

7.2 핵심 유지보수 방안

구축된 시스템의 장기적인 안정성과 보안을 유지하기 위해 다음의 정기적인 유지보수 활동이 필수적이다.

  • 데이터 백업: 모든 중요 데이터는 Docker 볼륨 내에 저장된다. 정기적으로 이 볼륨들을 백업하는 전략을 수립해야 한다.

  • Nextcloud: ~/nextcloud/db (PostgreSQL 데이터), ~/nextcloud/nextcloud (Nextcloud 파일 및 설정) 디렉토리

  • OpenProject: ~/openproject/_pgdata (PostgreSQL 데이터), ~/openproject/_opdata (첨부 파일 등) 디렉토리

  • 이 디렉토리들을 tarrsync와 같은 도구를 사용하여 압축하고 원격 저장소(NAS, 클라우드 스토리지 등)에 정기적으로 백업하는 스크립트를 작성하여 자동화하는 것이 바람직하다.

  • 컨테이너 이미지 업데이트: 각 애플리케이션의 보안 패치 및 기능 업데이트를 적용하기 위해 주기적으로 컨테이너 이미지를 업데이트해야 한다. 각 서비스의 작업 디렉토리(~/nextcloud, ~/openproject)에서 다음 명령을 순차적으로 실행하여 안전하게 업데이트를 수행할 수 있다.

# 1. 최신 이미지를 로컬로 다운로드
docker compose pull

# 2. 다운로드한 새 이미지로 컨테이너를 다시 생성하여 실행
docker compose up -d

OpenProject의 경우, git pull 명령을 먼저 실행하여 docker-compose.yml 파일 자체의 업데이트를 반영한 후 위 명령을 실행해야 한다.

  • TLS 인증서 갱신: Nginx Proxy Manager는 Let’s Encrypt 인증서의 만료 기간을 자동으로 확인하고, 만료 30일 이내에 자동으로 갱신을 시도한다. 따라서 별도의 수동 작업은 필요하지 않다. 다만, NPM의 알림(Notification) 기능을 설정하여 인증서 갱신 성공 또는 실패 시 이메일 등으로 알림을 받도록 구성하는 것이 좋다.

  • 로그 모니터링: 시스템에 문제가 발생했을 때 원인을 파악하기 위해 각 컨테이너의 로그를 확인하는 것이 중요하다. docker logs <container_name> 명령을 사용하여 특정 컨테이너의 로그를 조회할 수 있다. 예를 들어, Nextcloud 앱 컨테이너의 로그를 실시간으로 확인하려면 다음 명령을 사용한다.

docker logs -f nextcloud-app-1

정기적으로 로그를 검토하여 비정상적인 오류나 경고 메시지가 없는지 확인하는 것이 좋다.

8. 참고 자료

  1. User guide - OpenProject, https://www.openproject.org/docs/user-guide/
  2. Nextcloud integration - OpenProject, https://www.openproject.org/integrations/nextcloud/
  3. OpenProject Integration - Nextcloud App Store, https://apps.nextcloud.com/apps/integration_openproject
  4. OpenProject Nextcloud integration - complete admin and user guide - YouTube, https://www.youtube.com/watch?v=nPEFYicyHpI
  5. OpenProject development setup via docker, https://www.openproject.org/docs/development/development-environment/docker/
  6. nextcloud/docker: Docker image of Nextcloud - GitHub, https://github.com/nextcloud/docker
  7. OpenProject installation with Docker Compose - OpenProject, https://www.openproject.org/docs/installation-and-operations/installation/docker-compose/
  8. OpenProject advanced configuration, https://www.openproject.org/docs/installation-and-operations/configuration/
  9. Nextcloud integration setup - OpenProject, https://www.openproject.org/docs/system-admin-guide/integrations/nextcloud/
  10. Install Docker Engine on Ubuntu - Docker Docs, https://docs.docker.com/engine/install/ubuntu/
  11. Nextcloud Office - Self-hosted online office suite, https://nextcloud.com/office/
  12. nextcloud.com, https://nextcloud.com/blog/nextcloud-22-introduces-knowledge-management/#:~:text=The%20Collectives%20app%20makes%20knowledge,a%20key%20component%20of%20this.
  13. Nextcloud Office release solves document compatibility, overhauls knowledge management, https://nextcloud.com/blog/press_releases/nextcloud-office-release-solves-document-compatibility-overhauls-knowledge-management/
  14. Collabora vs. Onlyoffice - ℹ️ Support - Nextcloud community, https://help.nextcloud.com/t/collabora-vs-onlyoffice/134994
  15. Comparing Collabora Online with OnlyOffice, https://www.collaboraonline.com/comparing-collabora-with-onlyoffice/
  16. Collabora vs. Onlyoffice - #3 by bb77 - ℹ️ Support - Nextcloud community, https://help.nextcloud.com/t/collabora-vs-onlyoffice/134994/3
  17. ONLYOFFICE vs Nextcloud Office (Collabora) - which is better?, https://www.gesellschaft-zur-entwicklung-von-dingen.de/en/magazine/onlyoffice-vs-nextcloud-office-collabora-which-better
  18. draw.io Integrations, https://www.drawio.com/integrations
  19. Draw.io - Nextcloud App Store, https://apps.nextcloud.com/apps/drawio
  20. Draw.io VS Code Integration - Visual Studio Marketplace, https://marketplace.visualstudio.com/items?itemName=hediet.vscode-drawio
  21. GitLab integration - OpenProject, https://www.openproject.org/integrations/gitlab/
  22. GitHub integration - OpenProject, https://www.openproject.org/integrations/github/
  23. GitLab integration - OpenProject, https://www.openproject.org/docs/system-admin-guide/integrations/gitlab-integration/
  24. doc/user/project/integrations/open_project.md - GitLab, https://gitlab.com/gitlab-org/gitlab-ce/blob/e15c6c8d0058f229d5c7f39bd4babcd3b4b0a5fc/doc/user/project/integrations/open_project.md